//
//  TFTableViewCollectionItemLayout.h
//  GoodCarGoHomeProject
//
//  Created by Summer on 2018/1/23.
//  Copyright © 2018年 Summer. All rights reserved.
//

#import <Foundation/Foundation.h>

@class TFTableViewCollectionItemManager;

/**
 返回自定义的item宽度

 @param index 所在索引
 @return 对应的宽度
 */
typedef CGFloat(^TFTableViewCollectionItemLayoutCustomItemWidthAtIndexBlock)(NSInteger index);

/**
 TFTableViewCollectionItem的布局工具类
 */
@interface TFTableViewCollectionItemLayout : NSObject

/**
 item的总数量
 */
@property (nonatomic, assign) NSInteger itemCount;

/**
 边缘的insets
 @warning 总的宽度一开始都是按照屏幕宽度计算，如果你的tableView不是屏幕宽度，需要在设置marginInsets时增加对应的大小
 */
@property (nonatomic, assign) UIEdgeInsets marginInsets;

/**
 item固定宽度，设置此属性Item的宽度会固定，item间的间距则会自动计算，并且等间距
 */
@property (nonatomic, assign) CGFloat itemIntrinsicWidth;

/**
 自定义宽度block
 */
@property (nonatomic, copy, nullable) TFTableViewCollectionItemLayoutCustomItemWidthAtIndexBlock customItemWidthAtIndexBlock;

/**
 item的固定高度，必须设置此属性，高度不会自动计算。
 */
@property (nonatomic, assign) CGFloat itemIntrinsicHeight;

/**
 item的固定高度相对于宽度的比例，例如：当设置此属性为1.2，则高度为itemIntrinsicWidth*1.2
 */
@property (nonatomic, assign) CGFloat itemIntrinsicHeightRatioToWidth;

/**
 列数
 */
@property (nonatomic, assign) NSInteger listCount;

/**
 item水平方向间距，默认0.0
 */
@property (nonatomic, assign) CGFloat itemHorizontalSpace;

/**
 item竖直方向间距，默认0.0
 */
@property (nonatomic, assign) CGFloat itemVerticalSpace;

/**
 固定宽高排布，根据固定的宽高以及每个item之间的最小竖直、水平间距算出一个合适列数和行数

 @param intrinsicSize 固定宽高
 @param minHorizontalSpace 最小的水平间距
 @param verticalSpace 竖直间距
 @return TFTableViewCollectionItemLayout
 */
- (nonnull instancetype)initWithItemIntrinsicSize:(CGSize)intrinsicSize
                               minHorizontalSpace:(CGFloat)minHorizontalSpace
                                    verticalSpace:(CGFloat)verticalSpace;

/**
 固定宽高排布，根据固定的宽度和listCount获取相等的一个间距
 
 @param intrinsicSize 固定宽高
 @param verticalSpace 竖直间距
 @return TFTableViewCollectionItemLayout
 */
- (nonnull instancetype)initWithItemIntrinsicSize:(CGSize)intrinsicSize
                                        listCount:(NSInteger)listCount
                                    verticalSpace:(CGFloat)verticalSpace;

/**
 固定宽度排布，根据固定的宽度和listCount获取相等的一个间距，高度和宽度成比例
 
 @param intrinsicWidth 固定宽度
 @param verticalSpace 竖直间距
 @return TFTableViewCollectionItemLayout
 */
- (nonnull instancetype)initWithItemIntrinsicWidth:(CGFloat)intrinsicWidth
                                        listCount:(NSInteger)listCount
                                    verticalSpace:(CGFloat)verticalSpace
                      intrinsicHeightRatioToWidth:(CGFloat)intrinsicHeightRatioToWidth;



/**
 固定高度，宽度根据列数以及水平方向的间距等分

 @param listCount 列数
 @param horizontalSpace 水平间距
 @param verticalSpace 竖直间距
 @param intrinsicHeight 固定高度
 @return TFTableViewCollectionItemLayout
 */
- (nonnull instancetype)initWithItemListCount:(NSInteger)listCount
                              horizontalSpace:(CGFloat)horizontalSpace
                                verticalSpace:(CGFloat)verticalSpace
                              intrinsicHeight:(CGFloat)intrinsicHeight;

/**
 宽度根据列数以及水平方向的间距等分，高度和宽度成比例
 
 @param listCount 列数
 @param horizontalSpace 水平间距
 @param verticalSpace 竖直间距
 @param intrinsicHeightRatioToWidth 高度相对于宽度的比例
 @return TFTableViewCollectionItemLayout
 */
- (nonnull instancetype)initWithItemListCount:(NSInteger)listCount
                              horizontalSpace:(CGFloat)horizontalSpace
                                verticalSpace:(CGFloat)verticalSpace
                              intrinsicHeightRatioToWidth:(CGFloat)intrinsicHeightRatioToWidth;

/**
 固定高度，宽度通过自定义宽度的block里面返回

 @param customItemWidthAtIndexBlock 自定义返回宽度block
 @param horizontalSpace 水平间距
 @param verticalSpace 竖直间距
 @param intrinsicHeight 固定高度
 @return TFTableViewCollectionItemLayout
 */
- (nonnull instancetype)initWithItemCustomItemWidthBlock:(nonnull TFTableViewCollectionItemLayoutCustomItemWidthAtIndexBlock)customItemWidthAtIndexBlock
                                         horizontalSpace:(CGFloat)horizontalSpace
                                           verticalSpace:(CGFloat)verticalSpace
                                         intrinsicHeight:(CGFloat)intrinsicHeight;

/**
 布局计算frame信息
 */
- (void)layout;

/**
 总的高度
 */
@property (nonatomic, assign, readonly) CGFloat totalHeight;

/**
 计算好的这一组的frame数组
 */
@property (nonatomic, strong, readonly, nullable) NSArray *itemFramesArray;

@end
